package net.sinodata.smartframework.schedulejob.job;

import net.sinodata.smartframework.schedulejob.test.Demo;
import org.quartz.*;
import org.springframework.stereotype.Component;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Arrays;

@Component
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class HelloJob implements Job {
    private static final String SCAN_DIR = "D:\\test";

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {


        // 从上下文中获取任务的 JobDataMap，JobDataMap是一个用于存储任务数据的容器
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        // 由于Demo.COUNT对应的值是Int类型，所以是getInt，假如是String，就是getString
        int count = jobDataMap.getInt(Demo.COUNT);
        String jobName = context.getJobDetail().getKey().getName();

        System.out.println("任务第" + count+"次执行");
        //获取任务名称和分组
        System.out.println("任务名称：" + jobName);
        // 更新任务数据
        jobDataMap.put(Demo.COUNT, ++Demo.num);

        // 2. 扫描并处理文件
        scanAndProcessFiles();

    }

    // 3. 扫描目录并处理文件
    private void scanAndProcessFiles() {
        try {
            File dir = new File(SCAN_DIR);

            if (!dir.exists()) {
                System.err.println("目录不存在: " + SCAN_DIR);
                return;
            }

            System.out.println("开始扫描目录: " + SCAN_DIR);

            // 获取目录下所有文件
            File[] files = dir.listFiles();
            if (files == null || files.length == 0) {
                System.out.println("目录为空");
                return;
            }

            // 处理每个文件
            Arrays.stream(files)
                    .filter(File::isFile)
                    .forEach(this::processFile);

        } catch (Exception e) {
            System.err.println("扫描目录出错: " + e.getMessage());
            e.printStackTrace();
        }
    }

    // 4. 处理文件
    private void processFile(File file) {
        try {
            // 获取文件基本信息
            String fileName = file.getName();
            String fileType = getFileExtension(fileName);
            long fileSize = file.length();

            // 获取文件最后修改时间
            Path path = Paths.get(file.getAbsolutePath());// 获取文件路径
            BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);// 获取文件属性
            LocalDateTime lastModified = LocalDateTime.ofInstant(// 将Instant转换为LocalDateTime
                    attrs.lastModifiedTime().toInstant(), ZoneId.systemDefault());// 获取文件最后修改时间

            // 打印文件信息
            System.out.println("\n文件信息:");
            System.out.println("名称: " + fileName);
            System.out.println("类型: " + fileType);
            System.out.println("大小: " + formatFileSize(fileSize));
            System.out.println("最后修改时间: " + lastModified);

            // 这里可以添加你的业务逻辑，比如存入数据库等


        } catch (Exception e) {
            System.err.println("处理文件出错: " + file.getName() + ", 错误: " + e.getMessage());
        }
    }

    // 获取文件扩展名
    private String getFileExtension(String fileName) {
        int dotIndex = fileName.lastIndexOf('.');
        return (dotIndex == -1) ? "无扩展名" : fileName.substring(dotIndex).toLowerCase();
    }

    // 格式化文件大小
    private String formatFileSize(long size) {
        if (size < 1024) {
            return size + " B";
        } else if (size < 1024 * 1024) {
            return String.format("%.2f KB", size / 1024.0);
        } else if (size < 1024 * 1024 * 1024) {
            return String.format("%.2f MB", size / (1024.0 * 1024));
        } else {
            return String.format("%.2f GB", size / (1024.0 * 1024 * 1024));
        }
    }

}
